package beans;

import java.awt.List;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Random;

import javax.ejb.Stateless;
import javax.naming.InitialContext;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import entidades.Cliente;
import entidades.Cotizacion;
import entidades.CotizacionItem;
import entidades.CuentaCorriente;
import entidades.ResumenCuenta;
import beans.AdministradorClientes;

@Stateless
public class AdministradorClientesBean implements AdministradorClientes {

	@PersistenceContext(unitName="AdministradorClientes")
	public EntityManager manager;

	Cliente[] listaClientes;

	public void crearCliente(Cliente c) {
		System.out.println("Cliente creado Exitosamente.");
		// Generar el ID y persistir el cliente.

    	//c.setId(new Random().nextInt(100000));
    	

    	//c.setId(new Random().nextInt(100000));
		//String count=(String)manager.createQuery("SELECT c from clientes c").getSingleResult(); 
		//int id=((Long)manager.createQuery("select count(c) FROM entidades.Cliente c").getSingleResult()).intValue();
		
    	//c.setId();

    	manager.persist(c);
		
	}
	
	public void modificarCliente(Cliente c){
		
		/****
		c.setCuentaCorriente(new CuentaCorriente());
		c.setNombreCliente("Carlos");
		c.setCondVenta("IVA INSCRIPTO");
		c.setTipoCliente("Persona");
		c.setId(1);
		c.getCuentaCorriente().setSaldoactual(200);
		c.getCuentaCorriente().setNrocuenta(1);
		c.getCuentaCorriente().setCliente(c);
		***/
		
		manager.merge(c);
	}
	
	public void eliminarCliente(Cliente c){
		Cliente c2=this.getClienteConCtaCte(c);
		System.out.println("se borra el cliente "+c2.getCuentaCorriente().getSaldoactual());
		if(c2!=null){
			System.out.println("se borra el cliente "+c2.getNombreCliente());
			if(c2.getCuentaCorriente().getSaldoactual()==0){
				manager.remove(manager.find(Cliente.class, c.getId()));}
			else
			{}
				//System.out.println("su saldo es mayor a 0:(tiene "+c.getCuentaCorriente().getSaldoactual()+")");	
		}
		else{
			System.out.println("no se encontro el cliente");
		}
			
	}
	
	public entidades.Cliente getCliente(int pId)
	{
		return manager.find(Cliente.class, pId);	
	}
	
	/***************************************
	 * 
	 * 
	 * 
	 *  ESTE CODIGO NO FUNCIONA, SE CUELGA
	 * 
	 ****************************************/
	public ArrayList <entidades.Cliente> getListaClientes() {
		
		Cliente c = new Cliente();
		ArrayList<Cliente> clientesRegistrados = new ArrayList();
		
		Query query=manager.createQuery("select c FROM entidades.Cliente c");
		
		// Si en la tabla hay al menos un elemento, recorro la lista.
		while(query.getResultList().iterator().hasNext()){
		
			System.out.println("Entre al while...");
			c = (Cliente)query.getResultList().iterator().next();
			System.out.println(c.getNombreCliente());
			clientesRegistrados.add(c);
		}
		
		if (clientesRegistrados == null)
		{
			System.out.println("No hay clientes Registrados. Por favor Agregue al menos uno.\n");
			return (null);
		}
		
		return (clientesRegistrados);
		
		
	}
	
	public Cliente getClienteConCotizaciones(Cliente c){
		Cliente c2=manager.find(Cliente.class, c.getId());
		System.out.println(c2.getEmail());
		//Query q=manager.createQuery("select c from Cliente c where c.id="+c.getId()); 
		//Cliente c2=(Cliente)q.getSingleResult();
		//Cliente c2=manager.getReference(Cliente.class, c.getId());
		if(c2==null){
			System.out.println("problema");
			return null;
		}
		else{
			Cotizacion cotiz= new Cotizacion();
			ArrayList<Cotizacion> cotizacionesCliente = new ArrayList<Cotizacion>();
			Iterator results=manager.createQuery("select c FROM entidades.Cotizacion c where c.cliente="+c2.getId()).getResultList().iterator();
			
			while(results.hasNext()){
				
				System.out.println("Entre al while del get cotizaciones del cliente...");
				cotiz = (Cotizacion)results.next();
				cotizacionesCliente.add(cotiz);
				System.out.println(cotiz.getPrecio());
				cotiz=null;
				results.remove();
			}
			c2.setCotizaciones(cotizacionesCliente);
			return c2;
		}
	}
	
	public Cliente getClienteConCtaCte(Cliente c){
		Cliente c2=manager.find(Cliente.class, c.getId());
		if(c2==null){
			System.out.println("problema");
			return null;
		}
		else{
			CuentaCorriente ctacte= new CuentaCorriente();
			ctacte=(CuentaCorriente)manager.createQuery("select cte FROM entidades.CuentaCorriente cte where cte.cliente="+c2.getId()).getSingleResult();
			
			c2.setCuentaCorriente(ctacte);
			return c2;
		}
	}

	
}
